DynamoDB 의 Capacity (읽기/쓰기 용량 모드)에 대해 정리했습니다.
안녕하세요, 임채정입니다.
DynamoDB는 AWS의 대표적인 데이터베이스 서비스입니다.
DynamoDB는 NoSQL 데이터베이스인데 저는 SQL 데이터베이스만 사용했었기 때문에 익숙하지 않아서 이번에 공부를 해보려고 합니다.
그래서 오늘은 DynamoDB 의 Capacity (읽기/쓰기 용량 모드)에 대해 정리했습니다.
아젠다
- Capacity modes (용량 모드) 란?
- WCU (쓰기 용량 모드)
- RCU (읽기 용량 모드)
- 파티션의 정의
- 예시
1. Capacity modes (용량 모드) 란?
온디맨드 모드
- 워크로드에 따라 자동으로 읽기/쓰기 확장/축소
- 용량 계획 불필요
- 사용량에 대한 비용 지불
- 무제한 WCU & RCU으로 프로비저닝된 용량보다 2.5배 더 비싸다 (신중하게 사용해야 한다)
- RRU 및 WRU와 관련하여 사용하는 읽기/쓰기에는 요금이 부과
- Read Request Units (RRU) - 읽기의 처리량 (RCU와 동일)
- Write Request Units (WRU) - 쓰기의 처리량 (WCU와 동일)
- 사용 사례
- 알 수 없는 워크로드
- 예측할 수 없는 애플리케이션 트래픽
- 등등..
프로비저닝 모드 (기본값)
- 초당 읽기/쓰기 수를 지정
- 사전에 용량을 계획
- 프로비저닝된 읽기 및 쓰기 용량 단위 비용 지불
- 테이블에 프로비저닝된 읽기 및 쓰기 용량 단위가 있어야 한다
- Read Capacity Units (RCU) - 읽기의 처리량
- Write Capacity Units (WCU) - 쓰기의 처리량
- 수요에 맞게 처리량의 자동 확장을 설정하는 옵션
24시간마다 한 번씩 다른 모드로 전환할 수 있습니다.
예시
DynamoDB의 만들어진 테이블의 [추가 설정] 탭에서 읽기/쓰기 용량
이 어떻게 되어 있는지 확인할 수 있습니다.
편집을 하면 온디맨드 모드
와 프로비저닝 모드
를 변경할 수도 있습니다.
2. WCU (쓰기 용량 모드)
- 최대 1KB 항목의 쓰기 용량 단위 하나는 초당 쓰기 하나를 나타낸다
- 항목이 1KB보다 크면 더 많은 WCU가 사용된다 (1KB 씩 up)
ex 1)
항목 크기가 2KB인 초당 12개의 항목을 작성
12 * (2KB/1KB) = 24WCUs
ex 2)
항목 크기가 4.5KB인 초당 10개의 항목을 작성
10 * (5KB/1KB) = 50WCUs
ex 3)
항목 크기가 2KB인 분당 120개의 항목을 작성
(120/60) * (2KB/1KB) = 4WCUs
3. RCU (읽기 용량 모드)
- 읽기 용량 단위 1개에 대해
- 4KB 크기의 항목에 대해서 초당 강력한 일관된 읽기 1개
- 4KB 크기의 항목에 대해서 초당 최종적 일관된 읽기 2개
- 항목이 4KB보다 크면 RCU가 더 많이 소비됩니다. (4KB 씩 up)
최종적 일관된 읽기 (Eventually Consistent Read)
- default 설정
- DynamoDB 테이블에서 데이터를 읽을 때, 응답에 최근 완료된 쓰기 작업의 결과가 반영되지 않을 수 있고 부실 데이터가 일부 포함될 수 있음
- 쓰기 작업을 하고 잠시 후 읽기 요청을 반복하면 응답이 최신 데이터를 반환합니다.
- 예시) 위의 사진에서 쓰기를 진행하고 나서 server2와 3이 같은 내용으로 되기 전에 읽어버리면 잘못된 데이터를 읽을 수 있음
강력한 일관된 읽기 (Strongly Consistent Read)
- DynamoDB는 성공한 모든 이전 쓰기 작업의 업데이트가 반영된 최신 데이터를 포함하는 응답을 반환
- 단점
- 네트워크 지연 또는 중단이 발생한 경우에 사용 어려울 수 있고 DynamoDB는 서버 오류(HTTP 500) 를 반환할 수 있음
- 최종적 일관된 읽기보다 지연 시간이 더 길다
- 글로벌 보조 인덱스에서는 지원되지 않음
- 최종적 일관된 읽기보다 처리 용량을 더 많이 사용 (약 2배)
- 예시) 위의 사진에서 쓰기를 하자마자 바로 읽어서 최신 데이터를 가져올 수 있음
ex 1)
항목 크기가 4KB인 12개의 강력한 일관된 읽기
We need 12 * (4KB/4KB) = 12RCUs
ex 2)
항목 크기가 8KB인 16개의 최종적 일관된 읽기
We need (16/2) * (8KB/4KB) = 16RCUs
ex 3)
항목 크기가 6KB인 12개의 강력한 일관된 읽기
We need 12 * (8KB/4KB) = 24RCUs
4. 파티션의 정의
- 데이터는 파티션에 저장
- 파티션 키는 해시 알고리즘을 통해 파티션으로 이동하는 파티션을 파악
- 파티션 수를 계산하는 방법
- 파티션 수 (용량 기준) = (RCUs Total/3000) + (WCUs Total/1000)
- 파티션 단위 (크기별) = (총 크기/10GB)
- 파티션의 경우 = ceil(max(파티션 수 (용량 기준) , 파티션 단위 (크기별) ))
- WCU와 RCU는 파티션 전체에 고르게 분포되어 있습니다.
- 예시)
- 위의 사진에서 파티션키 ID_13 이 DynanoDB 내부의 해쉬 함수를 통해서 Partition1 으로 이동
- 위의 사진에서 파티션키 ID_45 이 DynanoDB 내부의 해쉬 함수를 통해서 Partition2 으로 이동
5. 예시
프로비저닝 모드
의 설정을 할 때 용량 계산기를 통해 크기나 초 등을 설정해서 드는 돈을 확인할 수 있습니다.
또한 테이블 읽기/쓰기 용량을 끄거나
켜서 최소, 최대 단위를 설정할 수도 있습니다.
지금 설정하고 있는 DynamoDB 테이블은 테스트를 위해 만들었기 때문에 간단하게 설정해주고 저장해주도록 하겠습니다.
편집이 완료되면 사진과 같이 설정한 용량에 대해 확인할 수 있습니다.
지금은 쓰기, 읽기 활동이 없기 때문에 쓰기, 읽기 용량이 1로 자동 설정되었습니다. 그에 대한 자동 크기 조정 활동도 바로 밑에서 확인할 수 있습니다.